/*
 * @Author: szx
 * @Date: 2022-03-16 16:21:31
 * @LastEditTime: 2022-03-16 16:24:54
 * @Description:
 * @FilePath: \learn\手撸JS源码\call&apply.js
 */
Function.prototype.myCall = function () {
    // apply 同写法
    if (typeof this !== 'function') throw `caller must be a function!`;

    const context = arguments[0] || window; //  上下文属性，如果没有就是window了
    const args = [...arguments].slice(1).flat(); // 对于 apply 的话，传入的是一个参数数组，因此将参数格式统一
    context.fn = this; // 这里有点抽象了，把当前发起调用的函数作为上下文的其中一个函数
    const res = context.fn(...args);    // 并且执行这个函数
    delete context.fn;  // 然后在上下文中删除这个函数

    return res;
};
